home *** CD-ROM | disk | FTP | other *** search
- {
- > I'm working on a FD replacement... I've got the EMSI stuff... but I
- > cant figure out how to calculate the CRCs.....
- I know that CRC16('**EMSI_IRQ') should be $8E08, CRC16('**EMSI_REQ')
- > should be $A77E. Can anyone provide me with such a CRC function,
- > together with an example on how to use it?
-
- Could you send me the EMSI specification or Pascal implementation?
- Here is CRC code:
- }
-
- program SerialCRC; { bit level calculations jh 3-31-92 }
- { HISTORY
- Author: John Howard
- Original: 03-31-92 1.0
- Material from Jack Crenshaw article in Embedded Systems Programming
- Revision: 10-30-93 2.0
-
- VALIDATE 0.4 method1= CRC-16, method2= CRC-32?
- }
-
- CONST Feedback = $8408; CRCmode = 'CRC-CCITT';
- { $A001; CRCmode = 'CRC-16'; }
- { $8000; CRCmode = 'LRCC-16'; }
- { $F0B8; CRCmode = 'SDLC IBM'; }
-
- VAR CRC : WORD;
-
- { Test-case data.
- Data string CCITT SDLC CRC16 XMODEM
-
- 'M' 99E1 9666 35C0 9969
- 'T' 14A1 1B26 FF01 1A71
- 'THE' 7D8D 448E 23B6 1E0A
- 'THE,QUICK,BROWN,FOX,0123456789' 7DC5 DF91 B96E 0498
- }
-
- type HexString = String[9];
-
- FUNCTION HexWord(W : Word) : HexString;
- const
- HexDigits : ARRAY[0..15] OF Char = '0123456789ABCDEF';
- var Temp : HexString;
- begin
- Temp[0] := #4;
- Temp[1] := HexDigits[W SHR 12];
- Temp[2] := HexDigits[(W SHR 8) AND $F];
- Temp[3] := HexDigits[(W SHR 4) AND $F];
- Temp[4] := HexDigits[W AND $F];
- HexWord := Temp;
- end;
-
- { For each byte processed calculate the newest CRC value }
- Procedure UpdateCRC(B: Byte);
- var i: integer;
- begin
- for i := 1 to 8 do begin
- if Odd(B) Xor Odd(CRC) then
- CRC := (CRC SHR 1) XOR Feedback
- else
- CRC := CRC SHR 1;
- B := B SHR 1;
- end;
- end;
-
- Procedure SendString(S: String);
- var i : integer;
- begin
- for i := 1 to length(S) do
- UpdateCRC( ord(S[i]) );
- end;
-
- Procedure SendMessage(S: String);
- var oldCRC : word;
- begin
- { CRC := $FFFF; SDLC must also complement result }
- CRC := 0;
- SendString(S);
- oldCRC := CRC;
- WriteLN( S);
- Write( CRCmode,' Computed is ');
- WriteLN( HexWord(CRC));
- UpdateCRC(OldCRC);
- UpdateCRC(OldCRC SHR 8);
- end;
-
- BEGIN (* **** Main **** *)
- SendMessage('M');
- WriteLN( HexWord(CRC));
-
- SendMessage('T');
- WriteLN( HexWord(CRC));
-
- SendMessage('THE');
- WriteLN( HexWord(CRC));
-
- SendMessage('THE,QUICK,BROWN,FOX,0123456789');
- WriteLN( HexWord(CRC));
- END.